package com.study.principle;

/**
 * 6大设计原则：迪米特原则，又叫最小知识原则
 *
 * 一个对象应该对其他对象有最少的了解；
 * 一个类应该对自己需要耦合或调用的类知道得最少，尽量减少对象之间的交互；
 * 如果两个对象之间不必彼此直接通信，那么这两个对象就不应当发生任何直接的相互作用；
 * 如果其中的一个对象需要调用另一个对象的某一个方法的话，可以通过第三者转发这个调用；
 *
 * 遵从迪米特法则能够让我们的设计降低类之间的耦合。
 * 在代理模式和外观模式中都有体现这个原则。
 *
 * @Author 网易云课堂微专业-java高级开发工程师【allen老师】
 * @Version 1.0
 */
public class LawofDemeterPrinciple {
    public static void main(String[] args) {

    }
}

// 假设川普要请杀手干掉蓬勃奥（核心成员不听话）
class Person {
    public String name;
}

class President {
    CoreMember coremember;

    public void kill(Person someone) {
        Killer killer = new Killer();
        killer.kill(someone);
    }
}

class CoreMember {
    private Killer killer;
}

class Killer {
    public void kill(Person someone) {
        System.out.println(someone.name + "被杀死了");
    }
}

/*
总统和一个杀手存在联系。我们可以想想，这不现实对吧。
川普是美国boss，一般杀手不屑于见，并且川普一般只和自己信任的人交往，所以和杀手打交道的事一般交给下面的人干。
 */
class Person2 {
    public String name;
}

class President2 {
    CoreMember2 coremember;

    public void kill(Person2 someone) {
        coremember.kill(someone);
    }
}

class CoreMember2 {
    private Killer2 killer;

    public void kill(Person2 someone) {
        killer.kill(someone);
    }
}

class Killer2 {
    public void kill(Person2 someone) {
        System.out.println(someone.name + "被杀死了");
    }
}

/*
上述设计显然会更符合实际情况，并且这样做也是符合迪米特法则的，对于川普来说，killer是川普的陌生人，
所以川普不应当和killer产生耦合关系，而应当是由他的手下去和杀手交接。

如果两个类不必彼此直接通信，那么这两个类就不应当发生直接的相互作用，
如果其中的一个类需要调用另一个类的一个方法的话，可以通过第三者转发这个调用。
 */